using System;
using UnityEngine;

[RequireComponent(typeof(CircleCollider2D))]
[RequireComponent(typeof(UniqueID))]
public class ItemPickUp : MonoBehaviour
{
    public float PickUpRadius = 1f;  // 拾取半径
    public InventoryItemData ItemData;  // 物品数据

    private CircleCollider2D myCollider;  // 碰撞器

    [SerializeField] private ItemPickUpSaveData itemSaveData;// 物品拾取的保存数据
    private string id;// 物品的唯一标识符


    private void Awake()
    {
        // id = GetComponent<UniqueID>().ID;// 获取物品的唯一标识符
        SaveLoad.OnLoadGame += LoadGame;// 注册加载游戏存档时的回调函数
        itemSaveData = new ItemPickUpSaveData(ItemData, transform.position, transform.rotation);// 创建物品的保存数据，包括物品信息、位置和旋转信息

        myCollider = GetComponent<CircleCollider2D>();
        myCollider.isTrigger = true;  // 将碰撞器设置为触发器
        myCollider.radius = PickUpRadius;  // 设置触发半径
    }

    private void Start()
    {
        id = GetComponent<UniqueID>().ID;
        SaveGameManager.data.activeItems.Add(id, itemSaveData);// 在保存的游戏数据中添加激活的物品数据
    }

    private void LoadGame(SaveData data)
    {
        if (data.collectedItems.Contains(id)) Destroy(gameObject);// 如果该物品已经被收集，则销毁物品对象
    }

    private void OnDestroy()
    {
        if (SaveGameManager.data.activeItems.ContainsKey(id)) SaveGameManager.data.activeItems.Remove(id);// 在保存的游戏数据中移除该物品的激活数据
        SaveLoad.OnLoadGame -= LoadGame;// 取消加载游戏存档时的回调函数
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        var inventory = other.transform.GetComponent<PlayerInventoryHolder>();
        if (inventory == null) return;

        if (inventory.AddToInventory(ItemData, 1))  // 尝试将物品添加到背包中
        {
            SaveGameManager.data.collectedItems.Add(id);// 将物品标记为已收集
            Destroy(gameObject);
        }

    }
}

[System.Serializable]
public struct ItemPickUpSaveData
{
    public InventoryItemData ItemData; // 物品数据
    public Vector3 position; // 物品的位置
    public Quaternion rotation; // 物品的旋转

    public ItemPickUpSaveData(InventoryItemData _data, Vector3 _position, Quaternion _rotation)
    {
        ItemData = _data;
        position = _position;
        rotation = _rotation;
    }
}